// Definition for singly-linked list.
struct ListNode {
  int val;
  ListNode* next;
  ListNode() : val(0), next(nullptr) {}
  ListNode(int x) : val(x), next(nullptr) {}
  ListNode(int x, ListNode* next) : val(x), next(next) {}
};
// TODO Definition for double-linked list.

// 链表反转:
// 反转head所指链表的所有节点
ListNode* reverse(ListNode* head);
// 仅反转[begin, end]部分的节点
void reverse(ListNode* pre, ListNode* begin, ListNode* end);
// k个节点一组反转链表，剩余节点不足k个就不反转
ListNode* reverse(ListNode* head, int k);